home *** CD-ROM | disk | FTP | other *** search
- PROGRAM PROG4(INPUT,OUTPUT);
- (****************************************************************)
- (* *)
- (* WRITTEN BY: PETER J. KINSELLA *)
- (* MOORHEAD MN (218) 233-8467 *)
- (* 1/12/87 *)
- (* *)
- (* *)
- (* THIS PROGRAM WILL CONVERT INTEGERS BETWEEN ANY TWO *)
- (* BASES SPECIFIED BY THE USER. *)
- (* *)
- (* *)
- (* INPUT: *)
- (* WILL CONSIST OF A SEQENCE OF LINES, EACH LINE HAVING A *)
- (* SERIES OF NUMBERS ON IT, THE FIRST NUMBER (WHICH MUST BE *)
- (* LESS THEN 16) IS THE BASE (B1) THE PROGRAM IS TO CONVERT *)
- (* FROM, FOLLOWED BY AT LEAST ONE BLANK AND A SECOND NUMBER *)
- (* (ALSO LESS THEN 16) THE PROGRAM WILL CONVERT TO (B2). *)
- (* THESE TWO NUMBERS MUST BE FOLLOWED BUY AT LEAST ONE *)
- (* BLANK AND THEN A SEQUENCE OF CONSECUTIVE NON-BLANK *)
- (* CHARACTERS WILL FOLLOW REPRESENTING THE VALUE OF THE BASE *)
- (* TO BE CONVERTED. *)
- (* *)
- (* *)
- (* OUTPUT: *)
- (* FOR EACH LINE OF INPUT AN OUT PUT LINE WILL BE WRITTEN *)
- (* SHOWING THE TWO BASES BEING CONVERTED BETWEEN ALONG WITH *)
- (* THE ORIGINAL AND CONVERTED VALUE OF THE NUMBER, OR SOME *)
- (* ERROR STATMENT GIVING SOME INDICATION AS TO WHY THE VALUE *)
- (* COULD NOT BE PROCESSED. *)
- (* *)
- (* *)
- (* ASSUMPTIONS: *)
- (* 1. NO BASE WILL BE, OR CONVERTED TO LARGER THEN BASE 16 *)
- (* 2. NO NONE ALPHA-NUMERIC CHARACTERS WILL BE IN THE *)
- (* INPUT FILE. *)
- (* 3. FOR LARGER THAN BASE 10 CONVERSIONS THIS PROGRAM *)
- (* SHOULD BE RUN ON AN EBCDIC OPERATING SYSTEM. *)
- (* *)
- (****************************************************************)
-
- VAR
- BASE1: INTEGER; (* VALUE OF BASE CONVERTING FROM *)
- BASE2: INTEGER; (* VALUE OF BASE CONVERTING TO *)
- SUM: INTEGER;
- CH: CHAR;
- FLAG: BOOLEAN; (* FALSE IF ERROR IN INPUT DATA *)
-
-
-
-
- FUNCTION VALUE(VAR CH: CHAR) : INTEGER;
- (*******************************************************)
- (* RETURNS BASE TEN EQUIVELENT OF NUMBER UP THROUGH F *)
- (*******************************************************)
-
- BEGIN (* VALUE *)
-
-
- VALUE:= ORD(CH) - ORD('0');
-
- IF (CH < '0' ) THEN
- VALUE:= (ORD(CH) - ORD('A')) + 10;
-
-
- END; (* VALUE *)
-
-
-
-
- PROCEDURE TEST(VAR CH:CHAR; VAR BASE1,SUM:INTEGER; VAR FLAG:BOOLEAN);
- (*******************************************************)
- (* CHECKS TO MAKE SURE CHARACTER IS A VALID NUMERIC *)
- (* INDICATOR. *)
- (*******************************************************)
-
-
- BEGIN (* TEST *)
-
- IF ((MAXINT/(SUM+1)) > VALUE(CH)) THEN
- FLAG :=FALSE;
-
- IF ((VALUE(CH) < BASE1) AND (VALUE(CH) >= 0)) THEN
- FLAG := TRUE
- ELSE
- BEGIN
- WRITE('*** DATA ERROR ***');
- FLAG := FALSE;
- WHILE CH <> ' ' DO
- READ(CH);
- END;
-
-
- END; (* TEST *)
-
-
-
- PROCEDURE BASE10(VAR CH:CHAR; VAR BASE1, SUM:INTEGER; VAR FLAG:BOOLEAN);
- (*******************************************************)
- (* CONVERTS A STIRING OF CHARACTERS TO BASE 10 *)
- (* EQUIVALENT THROUGH 'F' *)
- (*******************************************************)
-
-
-
-
- BEGIN (* BASE10 *)
-
- WHILE (CH <> ' ') DO
- BEGIN
- TEST(CH,BASE1,SUM,FLAG);
- IF (FLAG) THEN
- BEGIN
- WRITE (CH);
- SUM:= SUM * BASE1 + VALUE(CH);
- READ (CH);
- END
- END;
-
- END; (* BASE10 *)
-
-
-
-
-
- PROCEDURE CONVERT(VAR NUM, B2: INTEGER);
- (*******************************************************)
- (* THIS PROCEDURE CONVERTS BASE 10 NUMBER'S TO BASE *)
- (* 'B2' NUMBERS. *)
- (*******************************************************)
-
- VAR
- I : INTEGER; (* INDEX VARIABLE *)
- DIGIT: INTEGER; (* DIGIT IN BASE 'B2' *)
-
-
-
- FUNCTION POWER(VAR X, N :INTEGER):INTEGER;
- (********************************************************)
- (* THIS FUNCTION RAISES THE BASE 'X' TO THE POWER 'N' *)
- (********************************************************)
-
-
- VAR
- SUM, COUNT: INTEGER;
-
- BEGIN (* POWER *)
-
- SUM := 1;
- COUNT := 1;
-
- WHILE COUNT <= N DO
- BEGIN
- SUM := SUM * X;
- COUNT := COUNT + 1
- END;
-
- POWER := SUM
-
- END; (* POWER *)
-
-
-
-
- BEGIN (* CONVERT *)
-
- I:= 0;
-
- WHILE (NOT(POWER(B2,I) > NUM)) DO
- I := I + 1;
-
- WHILE I >= 1 DO
- BEGIN
- I := I - 1;
- DIGIT := NUM DIV POWER(B2,I);
- NUM := NUM MOD POWER(B2,I);
- WRITE(DIGIT:1);
- END;
-
- WRITELN;
-
- END; (* CONVERT *)
-
-
-
- BEGIN (* PROG4 *)
-
- WHILE NOT EOF DO
- BEGIN
-
- FLAG := TRUE;
- SUM := 0;
- READ(BASE1,BASE2);
-
- WRITE('BASE ',BASE1:2,' REPRESENTATION ');
-
- READ(CH);
- WHILE ((CH = ' ') AND (NOT EOF)) DO
- READ(CH);
-
- BASE10(CH, BASE1, SUM, FLAG);
- IF (FLAG) THEN
- BEGIN
- WRITE(' BASE ',BASE2:2,' REPRESENTATION ');
- CONVERT(SUM, BASE2);
- END;
-
- END;
- END. (* PROG4 *)